package com.mmall.common;

import com.mmall.util.PropertiesUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisPool {
    private static JedisPool pool;//jedis连接池
    //最大连接数，mmall.properties读取，PropertiesUtil读取，
    private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle","20"));
    //在jedispool中最大的idle状态(空闲的)的jedis实例的个数，mmall.properties读取，PropertiesUtil读取，
    private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle","20"));
    //在jedispool中最小的idle状态(空闲的)的jedis实例的个数，mmall.properties读取，PropertiesUtil读取，
    private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total","20"));

    //在borrow一个jedis实例的时候，是否要进行验证操作，，mmall.properties读取，PropertiesUtil读取，
    private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return","true"));
    //在放回一个jedis实例的时候，是否要进行验证操作，，PropertiesUtil读取，
    private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow","true"));
    //，PropertiesUtil读取，
    private static String redisIp = PropertiesUtil.getProperty("redis.ip");
    //，PropertiesUtil读取，
    private static Integer redisPort = Integer.parseInt(PropertiesUtil.getProperty("redis.port"));


    private static void initPool(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);
        config.setBlockWhenExhausted(true);//连接耗尽的时候，是否阻塞，false会抛出异常，true阻塞直到抛出超时异常。默认为true。
        pool = new JedisPool(config,redisIp,redisPort,1000*2);//1000*2是超时时间
    }

    static{
        initPool();
    }
    public static Jedis getJedis(){//RedisPoolUtil包一层
        return pool.getResource();
    }
    public static void returnBrokenResource(Jedis jedis){//RedisPoolUtil包一层
        pool.returnBrokenResource(jedis);
    }
    public static void returnResource(Jedis jedis){//RedisPoolUtil包一层
        pool.returnResource(jedis);
    }
    public static void main(String[] args) {
        Jedis jedis = pool.getResource();
        jedis.set("geelykey","geelyvalue");
        returnResource(jedis);
        pool.destroy();//临时调用，销毁连接池中的所有连接
        System.out.println("program is end");
    }
}
